1366. Фондовая биржа

 

Мировой финансовый кризис – довольно серьезная тема. Некоторые люди бывают расслаблеными, а другие весьма обеспокоенными. Джон – один из них. Его очень беспокоит изменение состояния фондовой биржи. Он ежедневно следит за ценами на акции в поисках тенденций к росту. Для данной последовательности чисел p1, p2, ..., pn, представляющих цены на акции, восходящий тренд является подпоследовательностью pi1 < pi2 < ... < pik с i1 < i2 < ... < ik. Задача Джона – найти самый длинный восходящий тренд.

 

Вход. Каждый набор данных соответствует определенному набору курсов акций. Набор данных начинается с длины l (l ≤ 105) последовательности чисел, за которыми следуют целые числа.

В любых местах входных данных могут встречаться пробелы. Входные данные верны и заканчиваются концом файла.

 

Выход. Выведите длину самого длинного восходящего тренда. Для каждого набора данных выведите ответ с новой строки.

 

Пример входа

Пример выхода

6

5 2 1 4 5 3

3 

1 1 1

4

4 3 2 1

3

1

1

 

 

РЕШЕНИЕ

наибольшая возрастающая подпоследовательность

 

Анализ алгоритма

Состоит из нескольких тестов. Каждый тест содержит последовательность чисел, для которой следует найти длину наибольшей возрастающей подпоследовательности.

 

Реализация алгоритма

Объявим вспомогательный массив lis.

 

#define MAX 100001

int lis[MAX];

 

Основная часть программы. Читаем и обрабатываем входную последовательность.

 

while (scanf("%d",&n) == 1)

{

  for (len = i = 0; i < n; i++)

  {

    scanf("%d",&element);

    pos = lower_bound(lis,lis+len,element) - lis;

    if (pos < len) lis[pos] = element; else lis[len++] = element;

  }

 

Выводим длину НВП.

 

  printf("%d\n",len);

}

 

Java реализация

 

import java.util.*;

 

public class Main

{

  public static void main(String[] args)

  {

    Scanner con = new Scanner(System.in);

    int lis[] = new int[100001];

    while (con.hasNextInt())

    {

      int n = con.nextInt();

      int len = 0;         

      for (int i = 0; i < n; i++)

      {

        int element = con.nextInt();

 

        int pos = Arrays.binarySearch(lis, 0, len, element);

        if(pos < 0) pos = - (pos + 1);

 

        lis[pos] = element;

        if(pos == len) len++;

      }

      System.out.println(len);     

    }

    con.close();

  }

}